<?php
require_once 'BancoDeDados.php';
class TipoEspaco {

    private $cod_tipo_espaco;
    private $descricao;
    private $vinculado;

    public function &getCod_tipo_espaco() {
        return $this->cod_tipo_espaco;
    }

    public function setCod_tipo_espaco(&$cod_tipo_espaco) {
        $this->cod_tipo_espaco = &$cod_tipo_espaco;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    public function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Natureza do Espaço existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into tipo_espaco (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Natureza do Espaço existente |".$temp);
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update tipo_espaco set ' . $campo_id . ' = ? where cod_tipo_espaco = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_tipo_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}"." |".$temp);
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from tipo_espaco where cod_tipo_espaco = ?');
        $result = $link->execute($stmt, array($this->cod_tipo_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from tipo_espaco order by descricao');
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $tipo_espaco = new TipoEspaco();
            $tipo_espaco->setCod_tipo_espaco($row['cod_tipo_espaco']);
            $tipo_espaco->setDescricao($row['descricao']);
            $resultado[] = &$tipo_espaco;
            unset($tipo_espaco);
        }
        return $resultado;
    }

    /**
     *
     * @param integer $cod_tipo_espaco
     * @return TipoEspaco 
     */
    public static function &consultar(&$cod_tipo_espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from tipo_espaco where cod_tipo_espaco = ?', array($cod_tipo_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Natureza do Espaço inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Natureza do Espaço com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $tipo_espaco = new TipoEspaco();
        $tipo_espaco->setCod_tipo_espaco($row['cod_tipo_espaco']);
        $tipo_espaco->setDescricao($row['descricao']);
        $tipo_espaco->setVinculado($tipo_espaco->verificarVinculacao());
        return $tipo_espaco;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_tipo_espaco from tipo_espaco where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    private function &verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_tipo_espaco from espaco where cod_tipo_espaco = ?', array($this->cod_tipo_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

}
?>